package com.dianwang.utils;

import java.io.*;
import java.net.URL;
import java.util.*;

/**
 * 从 txt 文件加载同义词，每行代表一组同义词，
 * 行内词以逗号分隔，并对这一组做去中心化处理。
 */
public class SynonymDictionary {
    // 存储同义词映射关系： key -> 该key的所有同义词
    private Map<String, Set<String>> synonymMap = new HashMap<>();

    /**
     * 构造函数，加载同义词词典 (txt 格式)。
     *
     * @param synonymTxtFile 同义词词典的 txt 文件名，位于资源目录下
     * @throws IOException 如果文件读取失败
     */
    public SynonymDictionary(String synonymTxtFile) throws IOException {
        loadSynonymDictionary(synonymTxtFile);
    }

    /**
     * 加载同义词词典 (txt 格式)，并进行去中心化处理
     *
     * @param synonymTxtFile 同义词词典的 txt 文件名，位于资源目录下
     * @throws IOException 如果文件读取失败
     */
    private void loadSynonymDictionary(String synonymTxtFile) throws IOException {
        // 获取资源文件
        InputStream is = getClass().getClassLoader().getResourceAsStream(synonymTxtFile);
        if (is == null) {
            throw new FileNotFoundException("同义词词典文件未找到: " + synonymTxtFile);
        }

        // 逐行读取
        try (BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"))) {
            String line;
            int lineCount = 0;
            while ((line = br.readLine()) != null) {
                lineCount++;
                line = line.trim();
                if (line.isEmpty()) {
                    continue; // 跳过空行
                }
                // 按逗号分割
                String[] words = line.split("\\s*,\\s*");
                // 同一个行内的所有词互为同义词
                goDecentralized(words);
            }
            System.out.println("同义词词典加载完成，共读取 " + lineCount + " 行。");
            System.out.println("去中心化处理后，词典大小: " + synonymMap.size());
        }
    }

    /**
     * 给定一组词 (同一行)，让它们互为同义词
     *
     * @param words 同义词数组
     */
    private void goDecentralized(String[] words) {
        // words数组中所有词彼此互为同义词
        // eg: [主变, 变电站, 本体]
        // => 主变 -> {变电站, 本体}, 变电站 -> {主变, 本体}, 本体 -> {主变, 变电站}
        List<String> group = new ArrayList<>();
        for (String w : words) {
            String key = w.trim();
            if (!key.isEmpty()) {
                group.add(key);
            }
        }

        for (String key : group) {
            // 同义词集合
            Set<String> set = synonymMap.getOrDefault(key, new HashSet<>());
            for (String other : group) {
                if (!other.equals(key)) {
                    set.add(other);
                }
            }
            // 更新
            synonymMap.put(key, set);
        }
    }

    /**
     * 获取指定词汇的同义词列表 (Set 转 List)
     *
     * @param word 需要查找同义词的词汇
     * @return 同义词列表，如果不存在则返回空列表
     */
    public List<String> getSynonyms(String word) {
        Set<String> syns = synonymMap.getOrDefault(word, Collections.emptySet());
        return new ArrayList<>(syns);
    }
}
